/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package loja.dao;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import loja.dao.exceptions.BuscaException;
import loja.dao.exceptions.ImpossivelCriarException;
import loja.dominio.FormaDePagamento;
import loja.dominio.ItemDeVenda;
import loja.dominio.Venda;

/**
 *
 * @author Rodrigo
 */
public class VendaDao extends AbstractGenericDao<Venda> {

    public VendaDao() throws SQLException {
    }

    private Venda construirVenda(ResultSet rs) throws SQLException, BuscaException {
        Venda venda = new Venda();
        ClienteDao clienteDao = new ClienteDao();
        ItemDeVendaDao itemDeVendaDao = new ItemDeVendaDao();

        venda.setId(rs.getLong("id_venda"));
        venda.setCliente(clienteDao.buscar(rs.getLong("id_cliente")));
        venda.setData(dateSqlToDateUtil(rs.getDate("data")));
        venda.setFormaDePagamento(FormaDePagamento.getFormaDePagamentoById(rs.getInt("id_forma_de_pagamento")));
        venda.setItens(itemDeVendaDao.buscarPorVenda(venda));

        return venda;
    }

    public void criar(Venda venda) throws ImpossivelCriarException {
        String sql = "insert into venda (idcliente, data, idformadepagamento)" + " values (?,?,?)";
        ItemDeVendaDao itemDeVendaDao = new ItemDeVendaDao();
        int id = 0;
        ResultSet rs = null;
        PreparedStatement stmt = null;
        List<ItemDeVenda> itens = null;

        try {

            iniciarTransacao();
            itemDeVendaDao.setConexao(getConexao());
            stmt = getConexao().prepareStatement(sql);

            if (venda.getCliente() != null) {
                stmt.setLong(1, venda.getCliente().getId());
            } else {
                stmt.setNull(1, java.sql.Types.NULL);
            }
            
            stmt.setDate(2, dateUtilToDateSql(venda.getData()));
            stmt.setLong(3, venda.getFormaDePagamento().getId());
            stmt.execute();


            //recuperar id da venda
            //setar id no objeto venda
            rs = stmt.getGeneratedKeys();
            if (rs.next()) {
                id = rs.getInt(1);
                venda.setId(Long.valueOf(id));
            }


            //salvar itens de venda
            itens = venda.getItens();for (ItemDeVenda item : itens) {
                itemDeVendaDao.criar(item);
            }            

            comitarTransacao();
            JOptionPane.showMessageDialog(null, "Registro salvo com SUCESSO!!!");
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new ImpossivelCriarException("Não foi possível criar uma nova venda.");
        } finally {
            closeStatement(stmt);
        }
    }

    public void atualizar(Venda venda) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void deletar(Venda venda) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Venda buscar(Long id) throws BuscaException {
        String sql = "select * from venda where id_venda=?";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Venda venda = null;

        try {

            stmt = getConexao().prepareStatement(sql);
            stmt.setLong(1, id);
            rs = stmt.executeQuery();

            while (rs.next()) {
                venda = construirVenda(rs);
            }

        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível buscar a venda.");

        }
        return venda;
    }

    public List<Venda> buscarTodos() throws BuscaException {
        String sql = "select * from venda";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<Venda> vendas = null;
        Venda venda = null;
        try {
            stmt = getConexao().prepareStatement(sql);

            rs = stmt.executeQuery();

            vendas = new ArrayList<Venda>();

            while (rs.next()) {
                venda = construirVenda(rs);
                vendas.add(venda);
            }
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível buscar as vendas.");
        }
        return vendas;

    }

    public List<Venda> buscarPorData(Date data) throws BuscaException {
        String sql = "select * from venda where data = ?";
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<Venda> vendas = null;
        Venda venda = null;
        try {
            stmt = getConexao().prepareStatement(sql);
            stmt.setDate(1, dateUtilToDateSql(data));
            rs = stmt.executeQuery();
            vendas = new ArrayList<Venda>();

            while (rs.next()) {
                venda = construirVenda(rs);
                vendas.add(venda);
            }
        } catch (SQLException ex) {
            cancelarTransacao(ex, this.getClass());
            throw new BuscaException("Não foi possível criar uma nova venda.");
        }
        return vendas;

    }

    public long contar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
